
'use script'

const util = require('util')
const uuid = require('node-uuid');

var utils = module.exports;

// control variable of func "myPrint"
var isPrintFlag = true;

/**
 * Check and invoke callback function
 */
utils.invokeCallback = function(cb) {
    if(!!cb && typeof cb === 'function') {
        cb.apply(null, Array.prototype.slice.call(arguments, 1));
    }
};

/**
 * clone an object
 */
utils.clone = function(origin) {
    if(!origin) {
        return;
    }

    var obj = {};
    for(var f in origin) {
        if(origin.hasOwnProperty(f)) {
            obj[f] = origin[f];
        }
    }
    return obj;
};

utils.size = function(obj) {
    if(!obj) {
        return 0;
    }

    var size = 0;
    for(var f in obj) {
        if(obj.hasOwnProperty(f)) {
            size++;
        }
    }

    return size;
};

// print the file name and the line number ~ begin
function getStack(){
    var orig = Error.prepareStackTrace;
    Error.prepareStackTrace = function(_, stack) {
        return stack;
    };
    var err = new Error();
    Error.captureStackTrace(err, arguments.callee);
    var stack = err.stack;
    Error.prepareStackTrace = orig;
    return stack;
}

function getFileName(stack) {
    return stack[1].getFileName();
}

function getLineNumber(stack){
    return stack[1].getLineNumber();
}

utils.myPrint = function() {
    if (isPrintFlag) {
        var len = arguments.length;
        if(len <= 0) {
            return;
        }
        var stack = getStack();
        var aimStr = '\'' + getFileName(stack) + '\' @' + getLineNumber(stack) + ' :\n';
        for(var i = 0; i < len; ++i) {
            aimStr += arguments[i] + ' ';
        }
        console.log('\n' + aimStr);
    }
};

utils.rand = function(arr){
    var leng = 0;
    for(var i = 0; i < arr.length; i++){
        leng += arr[i];
    }
    for(var i = 0; i < arr.length; i++){
        var random = Math.floor(Math.random()*leng);
        if (random < arr[i]){
            return i;
        }
        else {
            leng -= arr[i];
        }
    }
};

// x-real-ip 由nginx转发时添加
utils.clientIpV4 = function(req) {
    const ip = req.headers['x-real-ip'] ||
        req.connection.remoteAddress ||
        req.socket.remoteAddress
    return ip.split(':').pop()
};

// 判断手机号
utils.checkPhone = function(phone) {
    if(!(/^1[3|4|5|7|8]\d{9}$/.test(phone)))
        return false
    return true
};

// 验证密码格式是否符合要求
utils.checkPassword = function(password) {
    if (!password || password.length < 6 || password.length > 16) {
        return false
    }
    return true
};

// 4位随机数字
utils.rand4 = function() {
    return util.format('%d0000', Math.floor(Math.random() * 9999)).substr(0, 4)
};

// 6位随机数字
utils.rand6 = function() {
    return Math.floor(Math.random() * 899999 + 100000)
};

// uuid
utils.uuid = function() {
    return uuid.v4()
};

/**
 * 安全的将一个字符串数字 转为int
 * def 为当转换失败时，赋值的默认值
 */
utils.toInt = function(v, def) {
    const n = parseInt(v)
    return isNaN(n) ? (def || 0) : n
};

/**
 * 是否有效时间
 * @param date
 * @returns {boolean}
 */
utils.invalidDate = function(date) {
    return isNaN(date.getTime())
};

/**
 * 唯一订单id process.env.ID 一定要定义
 */
let orderTick = 0;
utils.orderId = function() {
    orderTick = (orderTick + 1) % 1000
    let id = process.env.ID || '00'
    let append = util.format('000%d', orderTick).substr(-3)
    return '01' + parseInt(+new Date(), 10) + id + append
};
